home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 090 / byt87ibm.arc / PMODE.ASM < prev    next >
Assembly Source File  |  1980-01-05  |  3KB  |  108 lines

  1. PAGE    ,132
  2. TITLE    PMODE
  3.  
  4. COMMENT @
  5.  
  6.      These procedures allow a protected mode program to avoid certain
  7.      protection exceptions.
  8.  
  9.      NOTES:  1. These procedures are intended to run in protected mode
  10.         on a 286 or 386-based computer.  Any attempt to execute
  11.         them in real mode, or on an 8088-based PC will most likely
  12.         result in a system crash!
  13.  
  14.           2. This file was assembled using Microsoft's MASM Version 4.0
  15.  
  16.     @
  17.  
  18. .286p                       ;enable protected mode instructions
  19.  
  20. CODE    SEGMENT PUBLIC 'CODE'
  21.     ASSUME CS:CODE
  22.  
  23. ;------------------------------------------------------------------------------
  24. ;    check_segment_limit: Determine if an offset is usable within a segment
  25. ;        INPUT:    BX - selector for the segment
  26. ;            CX - offset to check
  27. ;        OUTPUT: CF:  0 - selector:offset is OK
  28. ;                 1 - exception will occur if selector:offset used
  29. ;------------------------------------------------------------------------------
  30. check_segment_limit    PROC
  31.             PUBLIC check_segment_limit
  32.  
  33.     PUSH    DX
  34.     LSL    DX,BX                ;obtain the segment's limit
  35.     JNZ    exception_return        ;exit if bad selector
  36.     CMP    CX,DX                ;compare offset and limit
  37.     JA    exception_return        ;jump if offset above limit
  38.     CLC                    ;selector:offset OK
  39.     JMP    SHORT csl_exit            ;return to caller
  40. exception_return:
  41.     STC                    ;bad selector or offset
  42. csl_exit:
  43.     POP    DX
  44.     RET
  45.  
  46. check_segment_limit    ENDP
  47.  
  48.  
  49.  
  50. ;------------------------------------------------------------------------------
  51. ;    check_sensitive:  Determine if we can execute sensitive instructions
  52. ;        INPUT:    None
  53. ;        OUTPUT: CF:  0 - sensitive instructions OK at current privilege
  54. ;                 1 - exception will occur if we attempt a sensitive
  55. ;                 instruction
  56. ;------------------------------------------------------------------------------
  57. check_sensitive     PROC
  58.             PUBLIC check_sensitive
  59.  
  60.     PUSH    AX
  61.     PUSH    BX
  62.  
  63.     PUSHF                    ;save flags (IOPL) on stack
  64.     POP    AX                ;copy flags to AX
  65.     AND    AX,3000H            ;mask all but IOPL
  66.     SHR    AX,12                ;right-justify IOPL
  67.     MOV    BX,CS                ;CPL resides in CS
  68.     AND    BX,3                ;mask all but CPL
  69.     CMP    BX,AX                ;compare CPL and IOPL
  70.     JA    no_sensitive            ;jump if CPL > IOPL
  71.     CLC                    ;sensitive instructions OK
  72.     JMP    SHORT cs_exit
  73. no_sensitive:
  74.     STC                    ;exception occurs on sensitive
  75. cs_exit:
  76.     POP    BX
  77.     POP    AX
  78.     RET
  79.  
  80. check_sensitive     ENDP
  81.  
  82. ;------------------------------------------------------------------------------
  83. ;    check_privileged: Determine if we can execute privileged instructions
  84. ;        INPUT:    None
  85. ;        OUTPUT: CF:  0 - privileged instructions OK at current privilege
  86. ;                 1 - exception will occur if we attempt a privileged
  87. ;                 instruction
  88. ;------------------------------------------------------------------------------
  89. check_privileged    PROC
  90.             PUBLIC check_privileged
  91.  
  92.     PUSH    AX
  93.     MOV    AX,CS                ;CPL resides in CS
  94.     AND    AX,3                ;mask all but CPL
  95.     JNZ    no_privileged            ;jump if CPL <> 0
  96.     CLC                    ;privileged instructions OK
  97.     JMP    SHORT cp_exit
  98. no_privileged:
  99.     STC                    ;exception occurs on privileged
  100. cp_exit:
  101.     POP    AX
  102.     RET
  103.  
  104. check_privileged    ENDP
  105.  
  106. CODE    ENDS
  107.     END
  108. no_pr